package com.zenithmind.library.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.common.result.Result;
import com.zenithmind.library.pojo.domain.Category;
import com.zenithmind.library.pojo.dto.CategoryCreateDTO;
import com.zenithmind.library.pojo.dto.CategoryUpdateDTO;
import com.zenithmind.library.pojo.query.CategoryQuery;
import com.zenithmind.library.pojo.vo.CategoryVO;

import java.util.List;

/**
 * 图书分类服务接口
 * 
 * @author ZenithMind
 * @since 2024-06-14
 */
public interface CategoryService extends IService<Category> {

    /**
     * 分页查询分类
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<CategoryVO> getCategoryPage(CategoryQuery query);

    /**
     * 获取分类树
     * 
     * @param parentId 父分类ID
     * @return 分类树
     */
    List<CategoryVO> getCategoryTree(String parentId);

    /**
     * 获取所有分类树
     * 
     * @return 分类树
     */
    List<CategoryVO> getAllCategoryTree();

    /**
     * 根据ID获取分类详情
     * 
     * @param id 分类ID
     * @return 分类详情
     */
    CategoryVO getCategoryDetail(String id);

    /**
     * 创建分类
     * 
     * @param createDTO 创建DTO
     * @return 创建结果
     */
    Result<CategoryVO> createCategory(CategoryCreateDTO createDTO);

    /**
     * 更新分类
     * 
     * @param id 分类ID
     * @param updateDTO 更新DTO
     * @return 更新结果
     */
    Result<CategoryVO> updateCategory(String id, CategoryUpdateDTO updateDTO);

    /**
     * 删除分类
     * 
     * @param id 分类ID
     * @return 删除结果
     */
    Result<Void> deleteCategory(String id);

    /**
     * 批量删除分类
     * 
     * @param ids 分类ID列表
     * @return 删除结果
     */
    Result<Void> batchDeleteCategories(List<String> ids);

    /**
     * 启用分类
     * 
     * @param id 分类ID
     * @return 操作结果
     */
    Result<Void> enableCategory(String id);

    /**
     * 禁用分类
     * 
     * @param id 分类ID
     * @return 操作结果
     */
    Result<Void> disableCategory(String id);

    /**
     * 根据编码查询分类
     * 
     * @param code 分类编码
     * @return 分类信息
     */
    CategoryVO getCategoryByCode(String code);

    /**
     * 获取子分类
     * 
     * @param parentId 父分类ID
     * @return 子分类列表
     */
    List<CategoryVO> getChildren(String parentId);

    /**
     * 移动分类
     * 
     * @param id 分类ID
     * @param newParentId 新父分类ID
     * @return 操作结果
     */
    Result<Void> moveCategory(String id, String newParentId);

    /**
     * 更新分类排序
     * 
     * @param id 分类ID
     * @param sortOrder 排序号
     * @return 操作结果
     */
    Result<Void> updateCategorySortOrder(String id, Integer sortOrder);

    /**
     * 获取热门分类
     * 
     * @param limit 限制数量
     * @return 热门分类列表
     */
    List<CategoryVO> getHotCategories(Integer limit);

    /**
     * 更新分类图书数量
     * 
     * @param categoryId 分类ID
     * @return 更新结果
     */
    Result<Void> updateCategoryBookCount(String categoryId);

    /**
     * 检查分类编码是否存在
     * 
     * @param code 分类编码
     * @param excludeId 排除的ID
     * @return 是否存在
     */
    boolean existsByCode(String code, String excludeId);

    /**
     * 检查分类名称是否存在
     * 
     * @param name 分类名称
     * @param parentId 父分类ID
     * @param excludeId 排除的ID
     * @return 是否存在
     */
    boolean existsByName(String name, String parentId, String excludeId);

    /**
     * 导入分类数据
     * 
     * @param categories 分类列表
     * @return 导入结果
     */
    Result<String> importCategories(List<CategoryCreateDTO> categories);

    /**
     * 导出分类数据
     * 
     * @param query 查询条件
     * @return 导出文件路径
     */
    Result<String> exportCategories(CategoryQuery query);
}
